#ifndef __LINKLIST_H_
#define __LINKLIST_H_

#include <stdbool.h>

# define ElementType int

//链表节点类型
typedef struct Node
{
    ElementType data; //存储的数据
    struct Node* next;//后继节点
}Node;

//链表结构
typedef struct LinkList
{
    struct Node* head;//头指针，指向头结点
    int len;          //有效节点个数 
}LinkList;

//初始化
int LinkListInit(LinkList* list);
//尾插法
void LinkListInsertTail(LinkList* list, ElementType element);
////清空链表元素————将有效链表依次删除
void LinkListFree(LinkList* list);
//销毁链表
void LinkListDestroy(LinkList* list);
//判空
bool IsEmpty(LinkList* list);
//打印链表
void LinkListPrint(LinkList* list);
//头插法
void InsertHead(LinkList* list, ElementType element);
//指定下标位置插入
void LinkListInsertIndex(LinkList* list, ElementType element, int index);
//指定下标位置删除
void LinkListRemoveIndex(LinkList* list, int index);
//按值删除
void LinkListRemoveByElement(LinkList* list, ElementType element);
//按位置查找
ElementType* LinkListFindByIndex(LinkList* list, int index);
//返回指定元素下标
int* LinkListFindByElement(LinkList* list, ElementType element);
//按位置修改值
void LinkListSetValueByIndex(LinkList* list, ElementType element, int index);
//按值修改
void LinkListSetValueByElement(LinkList* list, ElementType oldValue, ElementType newValue);
//冒泡排序
void LinkListBubbleSort(LinkList* list);
//链表逆序
void LinkListReserveList(LinkList* list);
//链表逆序（递归）
Node* LinkListReserveList2(Node* node);
//链表有序合并
LinkList* LinkListMergeList(LinkList* list1, LinkList* list2);
LinkList * MergeList(LinkList *list1,LinkList *list2);

#endif